﻿using PersistenceLayer.DAL;
using PersistenceLayer.Model;
using SupportLayer.Constantes.OUTROS;
using SupportLayer.Constantes.PRODUTO;
using SupportLayer.Enums;
using SupportLayer.Objetos.Produto;
using System;
using System.Data;
using System.Data.Entity.Validation;
using System.Linq;
using System.Web.UI.WebControls;
using Util.ExtensionMethods;

namespace ByBikeShop.Administracao.Pages
{
	public partial class InfoProduto : BaseAdmin
	{
		private UCs.Mensagem.mensagens ucMensagem;

		public Int64 GetProdutoID
		{
			get
			{
				if ((Request.QueryString[OUTROS.PRODUTO_ID] == null) ||
						(Request.QueryString[OUTROS.PRODUTO_ID].ToString() == string.Empty))
					return 0;

				return Convert.ToInt64(Request.QueryString[OUTROS.PRODUTO_ID].ToString());
			}
		}
		public Acao GetAcao
		{
			get
			{
				if ((Request.QueryString[OUTROS.ACAO] == null) ||
						(Request.QueryString[OUTROS.ACAO].ToString() == string.Empty))
					return Acao.VER;

				if (GetProdutoID > 0)
					return Acao.EDITAR;

				return (Acao)Convert.ToInt32((Request.QueryString[OUTROS.ACAO].ToString()));
			}
			private set { ;}
		}

		private PersistenceLayer.Model.Produto p = new PersistenceLayer.Model.Produto();
		//private ProdutoClass Produto = new ProdutoClass();

		protected void Page_Load(object sender, EventArgs e)
		{
			try
			{
				base.PageLoad(false);
			}
			catch (Exception ex)
			{
				ucMensagem = (UCs.Mensagem.mensagens)LoadControl(ResolveUrl("/Administracao/UCs/Mensagem/mensagens.ascx"));
				ucMensagem.TipoMensagem = TiposMensagens.Erro;
				ucMensagem.Mensagem = ex.Message;
				placeMensagem.Controls.Add(ucMensagem);
			}
		}

		public override void CarregaDados()
		{
			if (IsPostBack)
				return;

			CarregaDDLs();

			if (GetAcao == Acao.EDITAR)
				CarregaProduto();
		}

		private void CarregaDDLs()
		{
			try
			{
				DataTable dtCategoriaMaster = new DataTable();
				DataTable dtCategorias = new DataTable();
				DataTable dtMarcas = new DataTable();

				dtCategoriaMaster.Columns.Add("ID");
				dtCategoriaMaster.Columns.Add("Descricao");
				dtCategorias.Columns.Add("ID");
				dtCategorias.Columns.Add("Descricao");
				dtMarcas.Columns.Add("ID");
				dtMarcas.Columns.Add("Descricao");

				dtCategoriaMaster.Rows.Add(0, "");
				foreach (Produto_Categoria_Master pcm in new Produto_Categoria_MasterDAL().Listar())
					dtCategoriaMaster.Rows.Add(pcm.ID, pcm.Descricao);

				dtCategorias.Rows.Add(0, "");
				foreach (Produto_Categoria c in new Produto_CategoriaDAL().Listar())
					dtCategorias.Rows.Add(c.ID, c.Descricao);

				dtMarcas.Rows.Add(0, "");
				foreach (Produto_Marca pm in new Produto_MarcaDAL().Listar().OrderBy(a => a.Descricao))
					dtMarcas.Rows.Add(pm.ID, pm.Descricao);

				ddlCategoriaMaster.DataSource = dtCategoriaMaster;
				ddlCategoriaMaster.DataTextField = "Descricao";
				ddlCategoriaMaster.DataValueField = "ID";
				ddlCategoriaMaster.DataBind();

				ddlCategoria.DataSource = ddlCategoriaSecundaria.DataSource = dtCategorias;
				ddlCategoria.DataTextField = "Descricao";
				ddlCategoria.DataValueField = "ID";
				ddlCategoria.DataBind();

				ddlCategoriaSecundaria.DataTextField = "Descricao";
				ddlCategoriaSecundaria.DataValueField = "ID";
				ddlCategoriaSecundaria.DataBind();

				ddlMarca.DataSource = dtMarcas;
				ddlMarca.DataTextField = "Descricao";
				ddlMarca.DataValueField = "ID";
				ddlMarca.DataBind();
			}
			catch (Exception ex)
			{
				ucMensagem = (UCs.Mensagem.mensagens)LoadControl(ResolveUrl("/Administracao/UCs/Mensagem/mensagens.ascx"));
				ucMensagem.TipoMensagem = TiposMensagens.Erro;
				ucMensagem.Mensagem = ex.Message;
				placeMensagem.Controls.Add(ucMensagem);
			}
		}

		public override void CarregaGrid()
		{
		}

		public override void PopulaGrid()
		{
		}

		private void CarregaProduto()
		{
			p = new ProdutoDAL().Obter(GetProdutoID);

			lblProdutoID.Text = p.ID.ToString();
			ddlCategoriaMaster.ClearSelection();
			ddlCategoriaMaster.Items.FindByValue(p.CategoriaMaster_ID.ToString()).Selected = true;
			ddlCategoria.ClearSelection();
			ddlCategoria.Items.FindByValue(p.Categoria_ID.ToString()).Selected = true;
			ddlCategoriaSecundaria.ClearSelection();
			ddlCategoriaSecundaria.Items.FindByValue(p.CategoriaSecundaria_ID.ToString()).Selected = true;
			ddlMarca.ClearSelection();
			ddlMarca.Items.FindByValue(p.Marca_ID.ToString()).Selected = true;
			txtModelo.Text = p.Modelo;
			txtPreco.Text = p.Preco.toMoneyString();
			txtPeso.Text = p.Peso.ToString();
			txtDescricao.Text = p.Descricao.Replace("<br />", "\r\n");
		}

		protected void btnSalvar_Click(object sender, EventArgs e)
		{
			try
			{
				if (ddlCategoriaMaster.SelectedItem.Value == "0")
					throw new ApplicationException("Escolha a Categoria Master do Produto!");

				if (ddlCategoria.SelectedItem.Value == "0")
					throw new ApplicationException("Escolha a Categoria do Produto!");

				if (ddlCategoriaSecundaria.SelectedItem.Value == "0")
					throw new ApplicationException("Escolha a Categoria Secundária do Produto (caso não tenha, coloque a mesma da Categoria!");

				if (ddlMarca.SelectedItem.Value == "0")
					throw new ApplicationException("Escolha a Categoria Master do Produto!");

				if (txtModelo.Text.Equals(string.Empty))
					throw new ApplicationException("Digite o modelo do Produto!");

				if (txtPeso.Text.Equals(string.Empty))
					throw new ApplicationException("Digite o peso do Produto!");

				if (txtPreco.Text.Equals(string.Empty))
					throw new ApplicationException("Digite o preço do Produto!");

				if (txtDescricao.Text.Equals(string.Empty))
					throw new ApplicationException("Digite a descrição do Produto!");

				decimal preco = 0;
				int peso = 0;

				if (!decimal.TryParse(txtPreco.Text, out preco))
					throw new ApplicationException("O valor digitado no campo Preço não é válido");

				if (!Int32.TryParse(txtPeso.Text, out peso))
					throw new ApplicationException("O valor digitado no campo Peso não é válido");

				if (GetAcao == Acao.ADICIONAR)
					p = new PersistenceLayer.Model.Produto();

				p.ID = GetProdutoID;
				p.CategoriaMaster_ID = Convert.ToInt16(ddlCategoriaMaster.SelectedItem.Value);
				p.Categoria_ID = Convert.ToInt32(ddlCategoria.SelectedItem.Value);
				p.CategoriaSecundaria_ID = Convert.ToInt32(ddlCategoriaSecundaria.SelectedItem.Value);
				p.Marca_ID = Convert.ToInt32(ddlMarca.SelectedItem.Value);
				p.Modelo = txtModelo.Text;
				p.Preco = Convert.ToDecimal(txtPreco.Text.Replace(",", "."));
				p.Foto_Principal = "";
				p.Descricao = txtDescricao.Text;
				p.Peso = Convert.ToInt32(txtPeso.Text);
				p.Data = DateTime.Now;

				var pd = new ProdutoDAL();

				if (GetAcao == Acao.EDITAR)
					pd.Atualizar(p);
				else if (GetAcao == Acao.ADICIONAR)
					if (!pd.Existe(p))
						p.ID = pd.Adicionar(p);
					else
						throw new ApplicationException("O produto já existe!");

				Response.Redirect("/Administracao/Pages/EspecificacoesProduto.aspx?" + OUTROS.ACAO + "=" + (int)GetAcao + "&" + OUTROS.PRODUTO_ID + "=" + p.ID.ToString());
			}
			catch (DbEntityValidationException dbeve)
			{
				string t = "";

				foreach (var item in dbeve.EntityValidationErrors)
				{
					foreach (var i in item.ValidationErrors)
					{
						t += "\r\n" + i.PropertyName + " " + i.ErrorMessage;
					}
				}

				ucMensagem = (UCs.Mensagem.mensagens)LoadControl(ResolveUrl("/Administracao/UCs/Mensagem/mensagens.ascx"));
				ucMensagem.TipoMensagem = TiposMensagens.Erro;
				ucMensagem.Mensagem = t;
				placeMensagem.Controls.Add(ucMensagem);
			}
			catch (Exception ex)
			{
				ucMensagem = (UCs.Mensagem.mensagens)LoadControl(ResolveUrl("/Administracao/UCs/Mensagem/mensagens.ascx"));
				ucMensagem.TipoMensagem = TiposMensagens.Erro;
				ucMensagem.Mensagem = ex.Message;
				placeMensagem.Controls.Add(ucMensagem);
			}
		}

		protected void btnCancelar_Click(object sender, EventArgs e)
		{
			try
			{
				Response.Redirect("Produtos.aspx");
			}
			catch (Exception)
			{
				throw;
			}
		}
	}
}